// #pragma GCC optimize(2)
#include <iostream>
#include <queue>
#include <map>
#include <unordered_map>
#include <vector>
#include <algorithm>
#include <cmath>
#include <string>
#include <cstring>
#include <set>
#include <unordered_set>
#include <bitset>
#define IOS ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
const int M=510;
int v[M],w[M];
int e[M],ne[M],h[M],idx;
int dfn[M],low[M],timestamp;
int stk[M],top;
bool in_stk[M];
int scc_cnt,id[M],_size[M];
int f[M][M];
int n,m;
int dout[M];
void add(int a,int b)
{
	e[idx]=b;
	ne[idx]=h[a];
	h[a]=idx++;
}
void tarjan(int u)
{
	dfn[u]=low[u]=++timestamp;
	stk[++top]=u; in_stk[u]=true;
	
	for(int i=h[u];~i;i=ne[i])
	{
		int j=e[i];
		if(!dfn[j])
		{
			tarjan(j);
			low[u]=min(low[u],low[j]);
		}
		else if(in_stk[j])low[u]=min(low[u],dfn[j]);
	}
	
	if(dfn[u]==low[u])
	{
		scc_cnt++;
		int y=0;
		do
		{
			y=stk[top--];
			in_stk[y]=false;
			id[y]=scc_cnt;
			_size[scc_cnt]++;
			v[n+scc_cnt]+=v[y];
			w[n+scc_cnt]+=w[y];
			
		}while(y!=u);
	}
}
void dfs(int u)
{
	for(int i=v[u];i<=m;i++) f[u][i]=w[u];
	for(int i=h[u];~i;i=ne[i])
	{
		int t=e[i];
		dfs(t);
		for(int j=m;j>=v[u];j--)
		{
			for(int k=0;k<=j-v[u];k++)
			{
				f[u][j]=max(f[u][j],f[u][j-k]+f[t][k]);
			}
		}
	}
}
int main()
{
	memset(h,-1,sizeof(h));
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>v[i];
	for(int i=1;i<=n;i++) cin>>w[i];
	for(int i=1;i<=n;i++)
	{
		int u;
		cin>>u;
		if(u) add(u,i);
	}
	
	for(int i=1;i<=n;i++)
	{
		if(!dfn[i]) tarjan(i);
	}
	
	for(int i=1;i<=n;i++)
	{
		for(int j=h[i];~j;j=ne[j])
		{
			int k=e[j];
			int a=id[i]+n, b=id[k]+n;
			if(a!=b) 
			{
				add(a,b);
				dout[b]++;
			}
		}
	}
	
	for(int i=n+1;i<=n+scc_cnt;i++)
	{
		if(dout[i]==0)
		{
			add(0,i);
		}
	}
	dfs(0);
	cout<<f[0][m];

	return 0;
}
